{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import tensorflow as tf"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tf.Tensor(\n",
      "[[1. 1. 1.]\n",
      " [1. 1. 1.]], shape=(2, 3), dtype=float32)\n",
      "tf.Tensor(\n",
      "[[10.  1.  1.]\n",
      " [ 1.  1.  1.]], shape=(2, 3), dtype=float32)\n"
     ]
    }
   ],
   "source": [
    "###======================================= assign value  ===================================#\n",
    "\n",
    "a = tf.ones([2,3])\n",
    "print(a)\n",
    "\n",
    "# a[0,0] = 10 => TypeError: 'tensorflow.python.framework.ops.EagerTensor' object does not support item assignment\n",
    "\n",
    "a = tf.Variable(a)\n",
    "a[0,0].assign(10)\n",
    "b = a.read_value()\n",
    "print(b)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "a + b : 5\n",
      "Addition with constants:  tf.Tensor(5, shape=(), dtype=int32)\n",
      "Addition with constants:  tf.Tensor(5, shape=(), dtype=int32)\n",
      "a * b : 6\n",
      "Multiplication with constants:  tf.Tensor(6, shape=(), dtype=int32)\n",
      "Multiplication with constants:  tf.Tensor(6, shape=(), dtype=int32)\n",
      "Multiplication with matrixes: tf.Tensor([[12.]], shape=(1, 1), dtype=float32)\n",
      "broadcast matrix in Multiplication: tf.Tensor(\n",
      "[[6. 6.]\n",
      " [6. 6.]], shape=(2, 2), dtype=float32)\n"
     ]
    }
   ],
   "source": [
    "###======================================= add, multiply, div. etc ===================================#\n",
    "\n",
    "a = tf.constant(2)\n",
    "b = tf.constant(3)\n",
    "\n",
    "print(\"a + b :\" , a.numpy() + b.numpy())\n",
    "print(\"Addition with constants: \", a+b)\n",
    "print(\"Addition with constants: \", tf.add(a, b))\n",
    "print(\"a * b :\" , a.numpy() * b.numpy())\n",
    "print(\"Multiplication with constants: \", a*b)\n",
    "print(\"Multiplication with constants: \", tf.multiply(a, b))\n",
    "\n",
    "\n",
    "# ----------------\n",
    "# More in details:\n",
    "# Matrix Multiplication from TensorFlow official tutorial\n",
    "\n",
    "# Create a Constant op that produces a 1x2 matrix.  The op is\n",
    "# added as a node to the default graph.\n",
    "#\n",
    "# The value returned by the constructor represents the output\n",
    "# of the Constant op.\n",
    "matrix1 = tf.constant([[3., 3.]])\n",
    "\n",
    "# Create another Constant that produces a 2x1 matrix.\n",
    "matrix2 = tf.constant([[2.],[2.]])\n",
    "\n",
    "# Create a Matmul op that takes 'matrix1' and 'matrix2' as inputs.\n",
    "# The returned value, 'product', represents the result of the matrix\n",
    "# multiplication.\n",
    "product = tf.matmul(matrix1, matrix2)\n",
    "print(\"Multiplication with matrixes:\", product)\n",
    "\n",
    "# broadcast matrix in Multiplication\n",
    "\n",
    "print(\"broadcast matrix in Multiplication:\", matrix1 * matrix2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tf.Tensor(2.0, shape=(), dtype=float32) tf.Tensor(2, shape=(), dtype=int32)\n"
     ]
    }
   ],
   "source": [
    "###===================================== cast operations =====================================#\n",
    "\n",
    "a = tf.convert_to_tensor(2.)\n",
    "b = tf.cast(a, tf.int32)\n",
    "print(a, b)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2 3\n",
      "tf.Tensor(2, shape=(), dtype=int32) tf.Tensor(3, shape=(), dtype=int32)\n"
     ]
    }
   ],
   "source": [
    "###===================================== shape operations ===================================#\n",
    "\n",
    "a = tf.ones([2,3])\n",
    "print(a.shape[0], a.shape[1]) # 2, 3\n",
    "shape = tf.shape(a)           # a tensor\n",
    "print(shape[0], shape[1])"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
